# gui.py - PDF处理GUI界面（直接运行启动）
import tkinter as tk
from tkinter import scrolledtext, LabelFrame
import sys
import logging
from io import StringIO
from contextlib import redirect_stdout, redirect_stderr
from config import Config
import traceback
# 修复1：添加导入create_gui_handler函数
from .utils.logger import pdf_logger, extract_logger, create_gui_handler

# -------------------------- 导入核心处理函数（关键：导入无需传参的organize_main）--------------------------
from .program.organize import main  
# 导入功能2（提取合并签字页，若无需功能2可删除以下2行）
from .program.extract import Extract  
extract_instance = Extract()


class PDFProcessorGUI:
    def __init__(self, root):
        self.root = root
        self.init_window()  # 初始化窗口
        self.create_widgets()  # 创建界面组件
        # 修复2：移除不存在的self.extract_logger()方法调用

    def init_window(self):
        """初始化窗口基本属性"""
        self.root.title("PDF签字页处理器")
        self.root.geometry("800x600")  # 窗口初始大小
        self.root.resizable(True, True)  # 允许拉伸
        self.font = ("微软雅黑", 10)  # 全局中文字体（避免乱码）

    def create_widgets(self):
        """创建所有界面组件（功能按钮+日志区）"""
        # 1. 功能按钮区域（Frame包裹，美观）
        btn_frame = LabelFrame(self.root, text="📌 功能选择", font=self.font, padx=10, pady=10)
        btn_frame.pack(fill=tk.X, padx=20, pady=20)

        # 功能1按钮：PDF匹配与插入
        btn_func1 = tk.Button(
            btn_frame,
            text="执行PDF匹配与插入",
            command=self.run_organize,
            width=25,
            height=4,
            font=self.font,
            bg="#E8F5E8",  # 浅绿色背景
            relief=tk.RAISED
        )
        btn_func1.pack(side=tk.LEFT, padx=30, pady=5)

        # 功能2按钮：提取合并签字页（若无需功能2可删除）
        btn_func2 = tk.Button(
            btn_frame,
            text="执行提取合并签字页",
            command=self.run_extract,
            width=25,
            height=4,
            font=self.font,
            bg="#E8F0FF",  # 浅蓝色背景
            relief=tk.RAISED
        )
        btn_func2.pack(side=tk.RIGHT, padx=30, pady=5)

        # 2. 日志显示区域（带滚动条的文本框）
        log_frame = LabelFrame(self.root, text="📋 处理日志", font=self.font, padx=10, pady=10)
        log_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)

        self.log_text = scrolledtext.ScrolledText(
            log_frame,
            wrap=tk.WORD,
            font=self.font,
            state=tk.DISABLED,  # 初始只读
            bg="#F8F8F8",
            fg="#333333"
        )
        self.log_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        # 修复3：使用create_gui_handler函数创建GUI日志处理器
        gui_handler = create_gui_handler(self.log_text)
        extract_logger.addHandler(gui_handler)
        extract_logger.setLevel(logging.INFO)  # 日志级别：INFO及以上
        pdf_logger.addHandler(gui_handler)
        pdf_logger.setLevel(logging.INFO)  # 日志级别：INFO及以上


    def write_log(self, message):
        """通用日志写入函数（用于功能1的print重定向）"""
        self.log_text.config(state=tk.NORMAL)
        self.log_text.insert(tk.END, message)
        self.log_text.see(tk.END)
        self.log_text.config(state=tk.DISABLED)

    def run_organize(self):
        """执行功能1：PDF匹配与插入（核心逻辑）"""
        # 写入功能开始标识
        self.write_log("📌 开始执行run_organize：PDF匹配与插入\n")
        # 修复：直接从Config类获取配置路径，而不是使用co_consts
        self.write_log(f"💡 源目录1：{Config.SOURCE_DIR1}\n💡 源目录2：{Config.SOURCE_DIR2}\n")
        self.write_log(" "*80 + "\n")

        try:
            # 重定向print输出到日志区（捕获功能1的所有打印信息）
            with StringIO() as buf, redirect_stdout(buf), redirect_stderr(buf):
                main()  # 调用核心处理函数（无需传参）
                self.write_log(buf.getvalue())  # 写入捕获的输出
            self.write_log("✅ run_organize 执行完成！\n")
        except Exception as e:
            # 捕获并显示错误信息
            self.write_log(f"❌ run_organize 执行出错：{str(e)}\n")
            self.write_log("详细错误栈：\n" + traceback.format_exc() + "\n")
        finally:
            self.write_log("="*80 + "\n\n")

    def run_extract(self):
        """执行功能2：提取合并签字页（若无需功能2可删除）"""
        self.write_log("="*80 + "\n")
        self.write_log("📌 开始执行 Function2：提取合并签字页\n")
        self.write_log("💡 路径配置来自 config.py\n")
        self.write_log("-"*80 + "\n")

        try:
            
            result = extract_instance.run()  # 调用功能2的核心方法
            self.write_log(f"✅ Function2 执行结果：{result}\n")
            self.write_log("✅ Function2 执行完成！\n")
        except Exception as e:
            self.write_log(f"❌ Function2 执行出错：{str(e)}\n")
            self.write_log("详细错误栈：\n" + traceback.format_exc() + "\n")
        finally:
            self.write_log("="*80 + "\n\n")

# -------------------------- 启动GUI --------------------------
if __name__ == "__main__":
    try:
        root = tk.Tk()
        app = PDFProcessorGUI(root)
        root.mainloop()
    except Exception as e:
        print(f"GUI启动失败：{str(e)}")
        traceback.print_exc()